﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using SIGCBI.Repository;
using Microsoft.Practices.Unity;
using System.Diagnostics;

namespace SIGCBI.BusinessLogic
{
    public interface IPartidaBL
    {
        List<PARTIDA> GetAllFromPartidas();
        List<PARTIDA> GetFromPartidasByNombre(string nombre);
        PARTIDA ValidarDuplicidadPartida(string codigo, int id);
        PARTIDA GetFromPartidaById(Int32 id);
        void AddPartida(PARTIDA partida);
        void UpdatePartida(PARTIDA partida);

        DETALLE_PARTIDA GetFromDetallePartidaByIdAreaAndIdPartida(Int32 idArea, Int32 IdPartida);
        void AddDetallePartida(DETALLE_PARTIDA detallePartida);

        void AddCambioPartida(CAMBIO_PARTIDAS cambioPartida);
        CAMBIO_PARTIDAS GetFromResolucion(Int32 idCambioPartida);

        List<DETALLE_PARTIDA> GetFromDetallePartidaByIdFuente(Int32 idFuente);

        void AddReducirPartida(REDUCIR_PRESUPUESTO reducirPartida);

        List<REDUCIR_PRESUPUESTO> GetAllGastosFromReducirPresupuestoByIdPartida(Int32 IdPartida);
    }

    public class PartidaBL : IPartidaBL
    {
        [Dependency]
        public IPartidaRepository partidaRepository { get; set; }

        public List<PARTIDA> GetAllFromPartidas()
        {
            return partidaRepository.GetAllFromPartidas();
        }

        public List<PARTIDA> GetFromPartidasByNombre(string nombre)
        {
            return partidaRepository.GetFromPartidasByNombre(nombre);
        }

        public PARTIDA GetFromPartidaById(int id)
        {
            return partidaRepository.GetFromPartidaById(id);
        }

        public void AddPartida(PARTIDA partida)
        {
            partidaRepository.AddPartida(partida);            
        }

        public void UpdatePartida(PARTIDA partida)
        {
            partidaRepository.UpdatePartida(partida);
        }


        public PARTIDA ValidarDuplicidadPartida(string codigo, int id)
        {
            return partidaRepository.ValidarDuplicidadPartida(codigo, id);
        }


        public DETALLE_PARTIDA GetFromDetallePartidaByIdAreaAndIdPartida(int idArea, int IdPartida)
        {
            return partidaRepository.GetFromDetallePartidaByIdAreaAndIdPartida(idArea, IdPartida);
        }


        public void AddDetallePartida(DETALLE_PARTIDA detallePartida)
        {
            var msg = "";
            var ok = detallePartida.Validate(out msg);
            if (ok)
            {
                partidaRepository.AddDetallePartida(detallePartida);
            }
            else
            {
                throw new Exception(msg);
            }
        }

        public void AddCambioPartida(CAMBIO_PARTIDAS cambioPartida)
        {
            var msg = "";
            var ok = cambioPartida.Validate(out msg);
            if (ok)
            {
                cambioPartida.Fecha = DateTime.Now;
                partidaRepository.AddCambioPartida(cambioPartida);
            }
            else
            {
                throw new Exception(msg);
            }
        }


        public CAMBIO_PARTIDAS GetFromResolucion(int idCambioPartida)
        {
            return partidaRepository.GetFromResolucion(idCambioPartida);
        }


        public List<DETALLE_PARTIDA> GetFromDetallePartidaByIdFuente(int idFuente)
        {
            return partidaRepository.GetFromDetallePartidaByIdFuente(idFuente);
        }


        public void AddReducirPartida(REDUCIR_PRESUPUESTO reducirPartida)
        {
            var msg = "";
            var ok = reducirPartida.Validate(out msg);
            if (ok)
            {
                reducirPartida.Fecha = DateTime.Now;
                partidaRepository.AddReducirPartida(reducirPartida);
            }
            else
            {
                throw new Exception(msg);
            }
        }


        public List<REDUCIR_PRESUPUESTO> GetAllGastosFromReducirPresupuestoByIdPartida(int IdPartida)
        {
            return partidaRepository.GetAllGastosFromReducirPresupuestoByIdPartida(IdPartida);
        }
    }
}
